iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
AI & Data

蟲王養成 - scrapy系列 第 10

DAY 10 : python csv 寫入 和dict 合併

  • 分享至 

  • xImage
  •  

先前發文
DAY 01 : 參賽目的與規劃
DAY 02 : python3 virtualenv 建置
DAY 03 : python3 request
DAY 04 : 使用beautifulsoup4 和lxml
DAY 05 : select 和find 抓取tag
DAY 06 : soup解析後 list取值
DAY 07 : request_header_cookie 通過網頁18限制
DAY 08 : ppt內文爬取
DAY 09 : 資料處理 split replace strip
DAY 10 : python csv 寫入 和dict 合併


那現在先來針對寫入的功能進行介紹

開始前決定主題:

  • class ppt_spider():
    然後寫出幾個功能(function)
  • start_requests
  • home_page
  • category_page
  • insert_data

start_requests 看名子就知道 是一開始定義爬蟲的入口 , 那也可以在開始爬蟲前就先把csv的欄位先定義好

首先import csv
寫一個def 把csv 的header(欄位)定義好 , 然後用csv的方法寫入該檔案 , 每筆資料使用 ; 來分割 , 之後就把要爬的網站入口丟給home_page那支function

def start_requests(self)
    header = ['firstpage', 'username', 'classname', 'category_pages', 'category_title', 'category_url', 'a_title', 'a_author', 'a_date', 'note_url', 'note']
    with open ('ptt.csv','a',encoding='utf-8') as f:
        csv_write = csv.DictWriter(f, fieldnames=header ,delimiter = ';')
        csv_write.writeheader()
        f.close()
    for url in self.start_urls:
        request_url = requests.get(url)
        self.home_page(request_url)

那通過一連串的資料爬取與cookie帶入 , 資料dict的合併及dict資料打包 , 帶入其他function

那資料的dict合併 , 如下meta1的dict資料 與meta2的資料進行合併

meta_12 = dict(meta1.items() | meta2.items())

meta1 = {
    "firstpage" : str(response.url),
    "username" : str(username),
    "classname" : str(classname),
    "category_pages" : str(category_pages),
    "category_title" : str(category_title),
    "category_url" : str(category_url)
}

meta2 = {
    "a_title" : str(a_title),
    "a_author" : str(a_author),
    "a_date" : str(a_date),
    "note_url" : str(note_url),
    "note" : str(note)
}
meta_12 = dict(meta1.items() | meta2.items())
self.insert_data(request_url, meta_12)

資料處理完後 , 就可以寫入剛剛欄位已經寫入的檔案了!!

def insert_data(self, response, meta_12):
    soup = BeautifulSoup(response.text,'lxml')
    checkpage = soup.title.text
    if '404 Not Found' in checkpage:
        pass
    else:
        meta_12["note"] = soup.select('#main-content')[0].text.split('※ 發信站')[0].replace('\n',' ')

    header = ['firstpage', 'username', 'classname', 'category_pages', 'category_title', 'category_url', 'a_title', 'a_author', 'a_date', 'note_url', 'note']
    with open ('ptt.csv','a',encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=header, delimiter = ';')
        meta_12 = {key: value for key, value in meta_12.items()if key in header}
        writer.writerow(meta_12)

唱歌唱歌!!
P!SCO-光圈


上一篇
DAY 09 : 資料處理 split replace strip
下一篇
DAY 11 : python class function
系列文
蟲王養成 - scrapy30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言